var express = require('express');
var router = express.Router();
var { AdminModel, OrderModel } = require('../model/model');
const { accessToken, refreshToken, secret } = require("../utils/token");
const jwt = require('jsonwebtoken');
const alipaySdk = require('../dbpay/alipay')
const AlipayFormData = require('alipay-sdk/lib/form').default;
const axios = require('axios');

// 登录接口
router.get('/login', async (req, res) => {
  let userphone = req.query.userphone;
  await AdminModel.find(req.query).then(data => {
    if (data.length > 0) {
      res.send({
        code: 200,
        msg: '登录成功',
        data: data[0],
        // 如果登录成功就返回两个Token，因为加入白名单了，所以会生成token，而不是验证token是否存在
        accessToken: accessToken({  //括号内事携带的用户信息，用来生成短token
          userphone
        }),
        refreshToken: refreshToken({  //括号内事携带的用户信息，用来生成长token
          userphone
        }),
      })
    } else {
      res.send({
        code: 201,
      })
    }
  })
})
// 注册账号
router.post('/adduser', async (req, res) => {
  let data = await AdminModel.find({ userphone: req.body.userphone })
  if (data.length > 0) {
    res.send({
      code: 201,
      msg: '该手机号已注册'
    })
  } else {
    AdminModel.create(req.body)
    res.send({
      code: 200,
      msg: '添加成功'
    })
  }
})

// 获取订单
router.get('/order', async (req, res) => {
  let data = await OrderModel.find()
  res.send({
    code: 200,
    data: data
  })
})

// 验证长token是否有效，刷新短token
// 这里要注意，在刷新短token的时候回也返回新的长token，延续长token，
// 这样活跃用户在持续操作过程中不会被迫退出登录。长时间无操作的非活
// 跃用户长token过期重新登录
//判断长token是否有效
router.get("/refresh", async (req, res) => {
  //获取请求头中携带的长的token
  let r_tk = req.headers.refreshtoken;
  //解析token
  jwt.verify(r_tk, secret, (err, decode) => {
    // 验证长token是否有效
    if (err) {
      //如果长token失效则返回401 前段回直接跳转会登录页面
      res.send({
        code: 401,
        msg: "token已过期，请重新登录",
      });
    } else {
      //如果长token有效则刷新两个token的保存时长
      res.send({
        code: 200,
        msg: "token刷新成功",
        accessToken: accessToken(), //里面的对象是携带的用户信息，是用来生成token的
        refreshToken: refreshToken(),
      });
    }
  });
});

// // 支付宝支付
router.post('/payment', async (req, res) => {
  //前端给后端的订单编号
  let { orderId } = req.body;
  //对接支付宝 -- 创建一个新的 AlipayFormData 实例
  const formData = new AlipayFormData();
  // 设置表单提交方法为 GET
  formData.setMethod('get')

  // 添加支付完成后的返回 URL
  formData.addField('returnUrl', `http://localhost:5173/#/pages/zn/paySucc/paySucc`)
  // 添加支付请求的业务内容
  formData.addField(
    'bizContent', {
    outTradeNo: orderId,  //订单号---必填
    productCode: 'FAST_INSTANT_TRADE_PAY',  //商品码
    totalAmount: '1.00',  //总金额---必填
    subject: '测试订单',   //商品标题
    body: '测试订单描述'   //商品描述
  }
  )
  // 调用支付宝 API 生成支付表单数据
  const result = alipaySdk.exec(
    'alipay.trade.page.pay',
    {},  //其他选项
    { formData: formData }
  )

  console.log('支付' + result);
  // 处理 API 调用返回的 Promise 结果
  result.then((result) => {
    // 将响应发送给客户端
    res.send({
      success: 'true',
      code: 200,
      data: result  // 支付宝返回的支付页面
    })
  }).catch((err) => {
    // 处理调用 API 失败的情况
    res.send({
      success: 'false',
      code: 500,
      msg: err
    })
  })
})

// 支付完成后
router.post('/queryOrder', async (req, res) => {
  let { out_trade_no, trade_no } = req.body
  // 对接支付宝
  const formData = new AlipayFormData();
  formData.setMethod('get')

  // 添加支付请求的业务内容
  formData.addField(
    'bizContent', {
    out_trade_no,  // 是订单编号
    trade_no  //是支付宝回调的订单流水号
  })
  // 调用支付宝 API 生成支付表单数据
  const result = alipaySdk.exec(
    'alipay.trade.query',
    {},  //其他选项
    { formData: formData }
  )

  // 处理 API 调用返回的 Promise 结果
  result.then((result) => {
    axios({
      url: result,
      method: 'get',
    }).then(data => {
      let r = data.data.alipay_trade_query_response
      if (r.code === '10000') {
        switch (r.trade_status) {
          case 'WAIT_BUYER_PAY':
            res.send({
              code: 200,
              msg: '支付宝有交易记录，没付款',
              data: true
            })
            break;
          case 'TRADE_FINISHED':
            res.send({
              code: 200,
              msg: '交易完成，不可以退款',
              data: true
            })
            break;
          case 'TRADE_SUCCESS':
            res.send({
              code: 200,
              msg: '交易完成，可以退款',
              data: true
            })
            break;
          case 'TRADE_CLOSED':
            res.send({
              code: 200,
              msg: '交易关闭，没有支付',
              data: true
            })
            break;
        }
      } else if (r.code === '40004') {
        res.send({
          code: 202,
          msg: '查询失败',
          data: r
        })
      }

    }).catch(err => {
      res.send({
        msg: '查询失败',
        err
      })
    })
  })
})

// 封装退款请求的函数
async function requestRefund(tradeNo, refundAmount, trade_no) {
  try {
    console.log(1111);
    const formData = new AlipayFormData();
    formData.setMethod('post')
    // 添加支付请求的业务内容
    formData.addField(
      'bizContent', {
      // out_trade_no: tradeNo, // 商户订单号
      trade_no: trade_no, // 支付宝交易号
      refund_amount: refundAmount, // 退款金额
      refund_reason: '测试退款', // 退款原因
      out_request_no: `refund-${Date.now()}`,
    })
    // 调用支付宝退款接口
    const response = await alipaySdk.exec(
      'alipay.trade.refund', {},
      { formData: formData }
    );
    console.log('1111'+response);
    
    // 检查响应
    if (response && response.alipay_trade_refund_response && response.alipay_trade_refund_response.code === '10000') {
      // 成功
      return {
        success: true,
        message: '退款成功',
        data: response.alipay_trade_refund_response
      };
    } else {
      // 失败
      return {
        success: false,
        message: '退款失败',
        data: response
      };
    }
  } catch (error) {
    console.log(222);
    // 错误处理
    console.error('退款请求出错:', error);
    return {
      success: false,
      message: '退款请求出错',
      data: error
    };
  }
}
router.post('/refund', async (req, res) => {
  let { out_trade_no, trade_no } = req.body
  console.log(trade_no + '111' + typeof trade_no);
  requestRefund(out_trade_no, '0.90', trade_no)
    .then(result => {
      // 返回退款状态给前端
      console.log(result);
      // 通常这里会使用res对象将result发送回前端
      // res.json(result);
    })
    .catch(error => {
      console.error('处理退款请求时出错:', error);
    });
})



module.exports = router;